package com.ftwj.config;

import com.ftwj.utils.result.MessageEnum;
import com.ftwj.utils.result.ResultBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import java.net.BindException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃  神兽保佑
 * 　　　　┃　　　┃  代码无bug
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━感觉萌萌哒━━━━━━
 * 类名： com.ftwj.config
 * 时间：2021-12-6 16:14
 * 描述：
 *
 * @author Liu_xg
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");


    /**
     * get请求中的参数校验
     * @param exception
     * @return
     */
    //@ExceptionHandler(ConstraintViolationException.class)
    //@ResponseStatus(HttpStatus.BAD_REQUEST)
    //public ResponseStatusListVo ConstraintViolationExceptionHandler(ConstraintViolationException exception){
    //    log.error("参数异常信息 :", exception);
    //    StringBuffer message = new StringBuffer();
    //    exception.getConstraintViolations().forEach(e -> {
    //        message.append(e.getMessage()).append(",");
    //    });
    //    String result = message.toString();
    //    return CommonResult.fail(result.substring(0, result.length() - 1));
    //}

    /**
     * form-data格式的参数校验
     *
     * @param exception
     * @return
     */
    @ExceptionHandler(BindException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ResultBean bindExceptionHandler(MethodArgumentNotValidException exception,
                                           HttpServletRequest request) {
        return getResponseStatusListVo(exception, request);
    }

    /**
     * @author Liu_xg
     * @date 2022-7-4 10:15
     * @description: 获取返回值
     */
    private ResultBean getResponseStatusListVo(MethodArgumentNotValidException exception, HttpServletRequest request) {


        List<FieldError> list = exception.getBindingResult().getFieldErrors();
        StringBuffer message = new StringBuffer();
        for (FieldError fieldError : list) {
            message.append("" + fieldError.getDefaultMessage());
        }

        return new ResultBean(700, message.toString());
    }

    /**
     * json格式的参数校验
     *
     * @param exception
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ResultBean handle(MethodArgumentNotValidException exception,
                                       HttpServletRequest request) {
        return getResponseStatusListVo(exception, request);
    }

    /**
     * 兜底的一个异常处理
     *
     * @param exception
     * @return
     */
    //@ExceptionHandler(Exception.class)
    //@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    //public ResponseStatusListVo excepitonHandler(Exception exception) {
    //    log.error("服务器异常 :", exception);
    //    return CommonResult.fail("服务器开小差了,请稍后重试!");
    //}

}
